#ifndef __TASK_DB_H__
#define __TASK_DB_H__


#include <tasks_manager/base_define.h>
#include <tasks_manager/msg_convert.h>
#include "../database/sqlite_operate.h"
#include <mutex>

class TaskDB{
    public:
        TaskDB(string task_db_path, string task_record_db_path);
        ~TaskDB();

        // 创建工作表
        void CreateTables();
        // 通用数据库指令执行 __task_db
        Json::Value TaskDBSqlite3Exec(string& sql_cmd);
        // 通用数据库指令执行 __task_record_db
        Json::Value TaskRecordDBSqlite3Exec(string& sql_cmd);
        // 清除为空的数据
        void DeleteNullData();

    public:
        /*******************************************
         * 单个任务基础操作
         *******************************************/  
        // 插入单个任务
        void InsertTaskSingle(Json::Value& json_data);
        // 插入单个任务
        void InsertTaskSingle(TaskSingle& task);
        // 更新单个任务
        void UpdateTaskSingle(string map_name, string task_name, TaskSingle& task);
        // 获取任务UUID
        string GetTaskSingleUuid(string map_name, string task_name);
        //  检测任务是否存在
        bool CheckTaskSingleExist(string map_name, string task_name);
        // 删除任务
        void DeleteTaskSingle(string map_name, string task_name);
        // 删除指定地图下所有任务
        void DeleteTaskSingleByMapName(string map_name);
        // 删除所有任务
        void DeleteTaskSingleAll();
        // 重命名任务
        void RenameTaskSingle(string map_name, string old_task_name, string new_task_name);
        // 获取指定地图下任务列表 按保存时间倒序
        vector<TaskSingle> GetTaskSingleList(string map_name);
        // 获取所有地图下的数据
        unordered_map<string, vector<TaskSingle>> GetAllTaskSingleList();
        // 更新任务路径
        void UpdateTaskSinglePath(string map_name, string task_name, Json::Value& json_data);
        // 更新任务路径
        void UpdateTaskSinglePath(string map_name, string task_name, TaskSingle& task);
        // 设置置顶
        void UpdateTaskSingleIsTop(string map_name, string task_name, bool is_top);
        // 更新总清扫面积
        void UpdateTaskArea(string map_name, string task_name, float task_area);
        // 更新地图名称
        void UpdateTaskSingleMapName(string old_map_name, string new_map_name);
        // 获取任务信息
        void GetTaskSingle(string map_name, string task_name, TaskSingle& task_single);

        /*******************************************
         * 组合任务基础操作
         *******************************************/   
        // 插入组合任务
        void InsertTaskGroup(Json::Value& json_data);
        // 插入组合任务
        void InsertTaskGroup(TaskGroup& task_group);
        //  检测组合任务是否存在
        bool CheckTaskGroupExist(string group_name);
        // 删除组合任务
        void DeleteTaskGroup(string group_name);
        // 删除所有组合任务
        void DeleteAllTaskGroup();
        // 重命名组合任务
        void RenameTaskGroup(string old_name, string new_name);
        // 设置置顶组合任务
        void UpdateTaskGroupIsTop(string group_name, bool is_top);
        // 更新组合任务下任务列表名称
        void UpdateTaskGroupTaskList(TaskGroup& task_group);
        // 组合任务信息查询
        bool GetTaskGroup(string group_name, TaskGroup& task_group);
        // 组合任务列表查询
        vector<TaskGroup> GetTaskGroupList();

        /*******************************************
         * 定时任务基础操作
         *******************************************/  
        // 插入定时任务
        void InsertTimerTask(Json::Value& json_data);
        // 插入定时任务
        void InsertTimerTask(TimerTask& timertask);
        //  检测定时任务是否存在
        bool CheckTimerTaskExist(string timertask_name);
        // 删除定时任务
        void DeleteTimerTask(string timertask_name);
        // 删除所有定时任务
        void DeleteAllTimerTask();
        // 删除指定地图下所有定时任务
        void DeleteTimerTaskByMapName(string map_name);
        // 定时任务更新地图名称
        void UpdateTimerTaskMapName(string old_map_name, string new_map_name);
        // 定时任务数据整体更新
        void UpdateTimerTask(string timer_task_name, Json::Value& new_json_data);
        // 定时任务数据更新
        void UpdateTimerTask(string timer_task_name, TimerTask& new_timer_task);
        // 设置置顶组合任务
        void UpdateTimerTaskIsTop(string timer_task_name, bool is_top);
        // 定时任务信息查询
        bool GetTimerTask(string timertask_name, TimerTask& timer_task);
        // 所有定时任务列表查询
        vector<TimerTask> GetTimerTaskList();
        // 更新定时任务下组合任务列表
        void UpdateTimerTaskGroupList(TimerTask& timertask);

        /*******************************************
         * 任务报告基础操作
         *******************************************/ 
        // 单个任务记录保存
        void InsertTaskSingleRecord(Json::Value& json_data);
        // 单个任务记录保存
        void InsertTaskSingleRecord(TaskSingle& task, string timertask_name, string timertask_id);
        //  检测单个任务记录是否存在
        bool CheckTaskSingleRecordExist(string task_id);
        // 插入任务报告
        void InsertTaskRecord(Json::Value& json_data, string save_time = "");
        // 插入任务报告
        void InsertTaskRecord(TaskRecord& task_record);
        // 插入任务报告
        void InsertTaskRecordWithSaveTime(TaskRecord& task_record, string save_time);
        //  检测任务报告是否存在
        bool CheckTaskRecordExist(string group_id);
        // 查询指定组合任务记录，需要group_id
        void QueryTaskRecords(string group_id, vector<TaskRecord>& task_records);
        // 查询组合任务记录（基于时间范围和页数）
        // ASC 表示升序排序，可以改为 DESC 表示降序排序。
        void FindTaskRecordFromTimeArray(string start_time, string end_time, int page, int page_size, vector<TaskRecord>& task_records);
        // 数据库自动清理测试 max_days天以前数据将被清理
        void TaskRecordAutoClean(int max_days);

        std::mutex __task_db_mutex;
    private:
        MsgConvert __msg_convert;
        boost::shared_ptr<SqliteBridge> __task_db_sqlite;  
        boost::shared_ptr<SqliteBridge> __task_record_db_sqlite; 
};


#endif